package com.agua.enturno.vista.paginas.prestador;

import com.agua.enturno.excepciones.ExcepcionDeReglaDelNegocio;
import com.agua.enturno.modelo.turno.EstadoDeTurno;
import com.agua.enturno.servicios.HorarioService;
import com.agua.enturno.util.DateFormatter;
import com.agua.enturno.vista.EnTurnoSession;
import com.agua.enturno.vista.componentes.AjaxConfirmLink;
import com.agua.enturno.vista.dto.HorarioDTO;
import com.agua.enturno.vista.eventos.HorarioSeleccionadoEvent;
import com.agua.enturno.vista.modelos.IntervalLabelModel;
import com.agua.enturno.vista.paginas.turnos.TurnosPage;
import com.agua.enturno.vista.util.RolDeUsuario;
import com.agua.enturno.vista.util.SemanasIterator;
import org.apache.wicket.ajax.AjaxRequestTarget;
import org.apache.wicket.event.IEvent;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.link.BookmarkablePageLink;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.markup.html.panel.Panel;
import org.apache.wicket.model.PropertyModel;
import org.apache.wicket.spring.injection.annot.SpringBean;
import org.joda.time.DateTime;
import org.joda.time.Interval;

public class AgendaDetailsPanel extends Panel {

	private static final String HORARIOS_COMPONENT_ID = "horarios-container";
	private static final long serialVersionUID = 1L;
	private static final String AGENDA_COMPONENT_ID = "agenda";


	@SpringBean
	private HorarioService horarioService;
	private HorarioDTO horario = new HorarioDTO(new Interval(DateTime.now(), DateTime.now().plusDays(1)), EstadoDeTurno.INEXISTENTE);
	private BookmarkablePageLink<String> turnosLink;
	
	public AgendaDetailsPanel(String id, final SemanasIterator semanasIterator) {
		super(id);
		this.setOutputMarkupPlaceholderTag(true);
		this.setVisible(false);
		
		add(new FeedbackPanel("feedback"));
		add(new Label("estado-label", new PropertyModel<String>(this, "horario.estado")));
		add(new Label("fecha-label", new IntervalLabelModel(new PropertyModel<Interval>(this, "horario.intervalo"))));
		add(new AjaxConfirmLink("sacar-turno-link", new PropertyModel<String>(this, "confirmationMessage")) {
			private static final long serialVersionUID = 1L;
			@Override
			public void onClick(AjaxRequestTarget target) {
				try {
					EnTurnoSession session = (EnTurnoSession) getSession();
						
					horarioService.sacarTurno(horario.getId(), session.getUsuario().getId(RolDeUsuario.CLIENTE));
					semanasIterator.recargarHorarios();
					turnosLink.setVisible(true);
					target.add(AgendaDetailsPanel.this);
					target.add(AgendaDetailsPanel.this.getParent().get(AGENDA_COMPONENT_ID).get(HORARIOS_COMPONENT_ID));
					
				} catch (ExcepcionDeReglaDelNegocio e) {
					error(e.getMessage());
					if (target != null) {
						target.add(AgendaDetailsPanel.this);
					}
				}
			}
		});
		
		turnosLink = new BookmarkablePageLink<String>("turnos-page-link", TurnosPage.class);
		turnosLink.setOutputMarkupPlaceholderTag(true);
		turnosLink.setVisible(false);
		add(turnosLink);
	}

	@Override
	public void onEvent(IEvent<?> event) {
		super.onEvent(event);
		
        if (event.getPayload() instanceof HorarioSeleccionadoEvent) {
        	
        	HorarioSeleccionadoEvent horarioSeleccionadoEvent = (HorarioSeleccionadoEvent) event.getPayload();
        	this.horario = horarioSeleccionadoEvent.getHorario();
        	horarioSeleccionadoEvent.getTarget().add(this);
        	
        	if (this.isVisible()) {
        		 if (turnosLink.isVisible()) 
        			 turnosLink.setVisible(false);
        	}
        	else {
        		this.setVisible(true);
        	}
        }
	}
	
	public String getConfirmationMessage() {
		return "¿Realmente desea sacar turno para el "+ DateFormatter.formatDateTime(horario.getIntervalo().getStart(), true) +"?";
	}
	
}
